import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { logError } from '@/utils/consoleLog'

export interface ErrorHandlerOptions {
  /** 是否显示用户提示 */
  showMessage?: boolean
  /** 自定义错误消息 */
  customMessage?: string
  /** 是否记录到控制台 */
  logToConsole?: boolean
}

export function useErrorHandler() {
  const isLoading = ref(false)
  const error = ref<Error | null>(null)

  /**
   * 处理异步操作的错误
   */
  const handleError = (
    error: unknown,
    context: string,
    options: ErrorHandlerOptions = {}
  ) => {
    const {
      showMessage = true,
      customMessage,
      logToConsole = true
    } = options

    const errorInstance = error instanceof Error ? error : new Error(String(error))
    
    // 记录错误到控制台
    if (logToConsole) {
      logError(`${context}:`, errorInstance)
    }

    // 显示用户友好的错误提示
    if (showMessage) {
      const message = customMessage || getErrorMessage(errorInstance, context)
      ElMessage.error(message)
    }

    // 更新错误状态
    error.value = errorInstance
  }

  /**
   * 包装异步函数，自动处理错误和加载状态
   */
  const withErrorHandling = async <T>(
    asyncFn: () => Promise<T>,
    context: string,
    options: ErrorHandlerOptions = {}
  ): Promise<T | null> => {
    isLoading.value = true
    error.value = null

    try {
      const result = await asyncFn()
      return result
    } catch (err) {
      handleError(err, context, options)
      return null
    } finally {
      isLoading.value = false
    }
  }

  /**
   * 获取用户友好的错误消息
   */
  const getErrorMessage = (error: Error, context: string): string => {
    // 网络错误
    if (error.message.includes('Network Error') || error.message.includes('fetch')) {
      return '网络连接失败，请检查网络后重试'
    }

    // 权限错误
    if (error.message.includes('401') || error.message.includes('Unauthorized')) {
      return '登录已过期，请重新登录'
    }

    // 服务器错误
    if (error.message.includes('500') || error.message.includes('Internal Server Error')) {
      return '服务器内部错误，请稍后重试'
    }

    // 数据格式错误
    if (error.message.includes('JSON') || error.message.includes('parse')) {
      return '数据格式错误，请联系管理员'
    }

    // 根据上下文提供特定错误消息
    const contextMessages: Record<string, string> = {
      '获取数据': '获取数据失败，请刷新页面重试',
      '更新数据': '更新数据失败，请重试',
      '删除数据': '删除数据失败，请重试',
      '初始化配置': '初始化配置失败，请刷新页面',
      '更新表格规则': '更新表格规则失败，请重试'
    }

    return contextMessages[context] || `${context}失败，请重试`
  }

  /**
   * 清除错误状态
   */
  const clearError = () => {
    error.value = null
  }

  return {
    isLoading,
    error,
    handleError,
    withErrorHandling,
    clearError
  }
}
